package com.example.tests;

import static  org.hamcrest.MatcherAssert.assertThat;
import static  org.hamcrest.Matchers.*;
import static  org.junit.Assert.*;

import java.util.List;

import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import com.example.fw.AccountHelper;
import com.example.fw.JamesHelper;
import com.example.fw.User;

public class SignupTest extends TestBase {
	public User user = new User().setLogin("user2").setPassword("123456").setEmail("user2@localhost.localdomain");
	public User admin = new User().setLogin("administrator ").setPassword("root").setEmail("root@localhost");
	
	private JamesHelper james;
	private AccountHelper accHelper;
		
	@BeforeClass
	public void createMailUser() {
		james = app.getJamesHelper();
		accHelper = app.getAccountHelper();
		
		if (!james.doesUserExist(user.login)) {
			james.createUser(user.login, user.password);
		}
	}
	
	@AfterClass
	public void deleteMailUser(){
		if (james.doesUserExist(user.login)) {
			james.deleteUser(user.login);
		}
	}
	
	@Test
	public void newUserShouldSignup(){
		accHelper.signup(user);
		accHelper.login(user);
		assertThat(accHelper.loggedUser(), equalTo(user.login));	
		accHelper.logout();
		
		// Удаление созданного пользователя 
		accHelper.deleteUser(user);
	}
	
	@Test
	public void existingUserShouldNoSignup(){	
		// Сначало создаем пользователя
		accHelper.signup(user);
		accHelper.login(user);
		assertThat(accHelper.loggedUser(), equalTo(user.login));
		accHelper.logout();
		
		// Пытаемся создать такого же пользователя
		try {
			accHelper.signup(user);
		} catch (Exception e){
			assertThat(e.getMessage(), containsString("That username is already being used. Please go back and select another one."));
			
			// Удаление созданного пользователя 
			accHelper.deleteUser(user);
			return;
		}
		fail("Exception excpected");
	}
	
	@Test
	public void deleteRegisteredUser(){	
		// Сначало создаем пользователя
		accHelper.signup(user);
		accHelper.login(user);
		assertThat(accHelper.loggedUser(), equalTo(user.login));
		accHelper.logout();
		
		// Проверяем пользователя в таблице
		accHelper.login(admin);
		
		accHelper.openManageUserPage();
		List<User> oldList = accHelper.getUserList();
		assertThat(user, isIn(oldList));
		
		// Удаление созданного пользователя из БД
		accHelper.deleteUser(user);
		accHelper.logout();
		
		// Проверяем что пользователя больше нет в списке
		accHelper.login(admin);
		accHelper.openManageUserPage();
		List<User> newList = accHelper.getUserList();
		assertThat(newList, not(equalTo(oldList)));
		assertThat(user, not(isIn((newList))));
		accHelper.logout();
	}


}
